/*
 * FSWUniCEUB - 2008
 * 
 * Este arquivo é de propriedade da Fábrica de Software do UniCEUB
 * 
 * Para mais informações entre em contato com a coordenação do
 * curso de Ciência da Computação da instituição.
 */

package br.uniceub.fsw.indicadores.bo;

import br.uniceub.fsw.arquitetura.servico.exception.NegocioException;
import br.uniceub.fsw.indicadores.dao.ObjetivoDAO;
import br.uniceub.fsw.indicadores.dao.ObjetivoIndicadorDAO;
import br.uniceub.fsw.indicadores.dao.PlanoMedicaoObjetivoDAO;
import br.uniceub.fsw.indicadores.vo.ObjetivoVO;
import br.uniceub.fsw.indicadores.vo.ObjetivoIndicadorVO;
import br.uniceub.fsw.indicadores.vo.PlanoMedicaoObjetivoVO;
import java.util.List;
/**
 * Business Object da entidade Objetivo. Essa classe é responsável por todos as
 * funcionalidades de negócio relacionadas à entidade.
 * 
 @author Marcos Mello Nobrega Soares ra2013617/8
 */
public class ObjetivoBO {

    ObjetivoDAO objetivoDAO = new ObjetivoDAO();
    
    /**
     * Valida se om registro de objetivo está pronto para inserção ou atualização.
     * 
     * @param objetivo objetivo a ser verificado.
     * @throws br.uniceub.fsw.arquitetura.servico.exception.RegraNegocioException caso o objetivo 
     * informado não possua condições de ser inserido ou atualizado no banco de dados.
     */
    public void validaObjetivo(ObjetivoVO objetivo) throws Exception, NegocioException {
        
        String mensagem = new String();
        
        if(objetivo.getNoObjetivo() == null || objetivo.getNoObjetivo().equals("")) {
            mensagem = mensagem.concat("Nome do objetivo obrigatório.\n");
        }
        if(objetivo.getCdTipoObjetivo() == null || objetivo.getCdTipoObjetivo() == 0) {
            mensagem = mensagem.concat("Tipo de objetivo obrigatório.<br />");
        }
        if(objetivo.getDsObjetivo() == null || objetivo.getDsObjetivo().equals("")) {
            mensagem = mensagem.concat("Descrição do objetivo obrigatória.\n");
        }
        if(objetivo.getNoObjetivo() != null && !objetivo.getNoObjetivo().isEmpty()) {
            try {  
                validarVOUnico(objetivo);
            }
            catch(NegocioException e) {
                mensagem = mensagem.concat(e.getMessage());
            }
            catch(Exception e) {
                throw new Exception(e.getMessage());
            }
        }
        
        if(!mensagem.isEmpty())
            throw new NegocioException(mensagem);
    }
    
    /**
     * Valida se já existe um registro de objetivo no Banco de Dados como verificação para inserção.
     * 
     * @param objetivo objetivo a ser verificado.
     * @throws br.uniceub.fsw.arquitetura.servico.exception.RegraNegocioException caso o objetivo 
     * informado não possua nome para a verificação ou não já exista um Objetivo com o mesmo nome no banco de dados.
     */
    public void validarVOUnico(ObjetivoVO objetivo) throws Exception, NegocioException {
        
        if(objetivo.getNoObjetivo() == null || objetivo.getNoObjetivo().isEmpty())
            throw new Exception("Nome do objetivo não foi informado.");
        
        ObjetivoVO objetivoExemplo = new ObjetivoVO();
        List<ObjetivoVO> lista;
        
        objetivoExemplo.setNoObjetivo(objetivo.getNoObjetivo());
        lista = objetivoDAO.consultarPorExemplo(objetivoExemplo);
        
        if(!lista.isEmpty())
            if(objetivo.getIdObjetivo() == null || (objetivo.getIdObjetivo() != null && !lista.get(0).getIdObjetivo().equals(objetivo.getIdObjetivo())))
                throw new NegocioException("Já existe um objetivo de nome \"" + objetivo.getNoObjetivo() +
                 "\" na base de dados.");
    }
    
    /**
     * Verifica se o objetivo está associado a indicadores ou planos de medição. Se positivo,
     * o objetivo não pode ser excluído.
     * 
     * @param objetivo objetivo a ser verificado.
     * @throws br.uniceub.fsw.arquitetura.servico.exception.RegraNegocioException caso o objetivo 
     * esteja associado a
     */
    public void validaExclusão(ObjetivoVO objetivo) throws Exception, NegocioException {
    
        if(objetivo.getIdObjetivo() == null)
            throw new Exception("Objetivo não foi informado.");
        
        ObjetivoIndicadorVO objetivoIndicadorExemplo = new ObjetivoIndicadorVO();
        objetivoIndicadorExemplo.setCdObjetivo(objetivo.getIdObjetivo());
        
        PlanoMedicaoObjetivoVO planoMedicaoObjetivoExemplo = new PlanoMedicaoObjetivoVO();
        planoMedicaoObjetivoExemplo.setCdObjetivo(objetivo.getIdObjetivo());
        
        List<ObjetivoIndicadorVO> oi = new ObjetivoIndicadorDAO().consultarPorExemplo(objetivoIndicadorExemplo);
        List<PlanoMedicaoObjetivoVO> po = new PlanoMedicaoObjetivoDAO().consultarPorExemplo(planoMedicaoObjetivoExemplo);
                
        if(oi.size() > 0 || po.size() > 0 ) 
             throw new NegocioException("O objetivo não pode ser excluído " +
                     "pois está associado a um plano de medição ou indicador.");
        
    }
}
